概念,原理,到例子,全解析logback ,学会日志系统

您所在的位置:网站首页 log4j logger标签 概念,原理,到例子,全解析logback ,学会日志系统

概念,原理,到例子,全解析logback ,学会日志系统

#概念,原理,到例子,全解析logback ,学会日志系统| 来源: 网络整理| 查看: 265

不管是游戏还是其他的web开发,日志都是非常重要的组件,是解决问题的关键,今天聊聊日志组件Logback。

在业务系统开发中,一般使用的日志框架有 Commons logging 、 Log4j 、 Slf4j 、 Logback 、 Log4j 2 等。

业务日志一般分为trace 、 debug 、 warn、 info 和 error 级别等,线上系统根据其特点进行的相应设置也不同,有的设置为 debug 级别,有的设置为 info 、error 级别在刚上线且不稳定的项目中通常设置为 debug 级别,便于查找问题;在线上系统稳定后使用 error级别即可,这样能够有效地提高效率。避免一些不必要的日志影响解决问题。废话不多说,开始吧。

1、slf4j 和logback的绑定1、SLF4J和logback 原理

SLF4J是简单的日志外观模式框架,抽象了各种日志框架例如Logback、Log4j、Commons-logging和JDK自带的logging实现接口。它使得用户可以在部署时使用自己想要的日志框架。SLF4J没有替代任何日志框架,它仅仅是标准日志框架的外观模式。如果在类路径下除了SLF4J再没有任何日志框架,那么默认状态是在控制台输出日志。

1、slf4j是java的一个日志门面,实现了日志框架一些通用的api,log4j和logback是具体的日志框架。

2、他们可以单独的使用,也可以绑定slf4j一起使用。

单独使用,分别调用框架自己的方法来输出日志信息。绑定slf4j一起使用。调用slf4j的api来输入日志信息,具体使用与底层日志框架无关(需要底层框架的配置文件)。显然不推荐单独使用日志框架。假设项目中已经使用了log4j,而我们此时加载了一个类库,而这个类库依赖另一个日志框架。这个时候我们就需要维护两个日志框架,这是一个非常麻烦的事情。而使用了slf4j就不同了,由于应用调用的抽象层的api,与底层日志框架是无关的,因此可以任意更换日志框架。

2、源码解析

起点:LoggerFactory.getLogger(App.class),一步一步跟着往下点就可以了。

获取日志factory,如果没初始化,需要初始化

开始进行绑定。

查找StaticLoggerBinder 的实现类

查找系统资源的实现

调用classloader 的接口查找资源,注意路径为 org/slf4j/impl/StaticLoggerBinder.class(这是规则)

getResources() 接口的翻译:查找所有的给定的资源名的资源,资源可以是 图片,声音,文本等等。或者可以被访问的类的代码。

资源的路径是用/ 分割的。

总结:slf4j 在启动的时候查找当前需要的logger,会找到实现的StaticLoggerBinder。

也就是说logback需要在包内实现 org/slf4j/impl/StaticLoggerBinder,然后就会slf4j 和logback 进行绑定

注意:找到实现是通过classLoader.getResource 进行实现的。可以跨越jar包查询

2.3、自己实现:(技术点)public class App { public static void main(String[] args) throws IOException { Enumeration resources = App.class.getClassLoader().getResources("org/slf4j/impl/StaticLoggerBinder.class"); while(resources.hasMoreElements()) { URL path = resources.nextElement(); System.out.println(path); } } }

运行结果如下:

可以看到我们加载到了logback的实现类。

2、logback的概念1、配置文件的加载顺序

logback允许多配置文件,其加载时读取配置文件的顺序如下:

在classpath查找logback-test.xml(一般classpath为src/test/resources)如果该文件不存在,logback尝试寻找logback.groovy如果该文件不存在,logback尝试寻找logback.xml如果该文件不存在,logback会在META-INF下查找[com.qos.logback.classic.spi.Configurator](http://logback.qos.ch/xref/ch/qos/logback/classic/spi/Configurator.html)接口的实现如果依然找不到,则会使用默认的BasicConfigurator,导致日志直接打印到控制台,日志等级为DEBUG,日志的格式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n2、配置详解2.1、configurationscan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。2.2 root标签

root标签要求在配置中必须声明一次,root标签其实定义的是root logger的配置信息,它的默认的日志级别为debug。所有的logger的最终的父logger一定是root logger。

root标签实质是标签,不过其是根标签;若 或 标签为设置输出级别时就会默认继承该标签设置的级别!

2.3 appender

appender让我们的应用知道怎么打、打印到哪里、打印成什么样;而logger则是告诉应用哪些可以这么打。例如某个类下的日志可以使用这个appender打印或者某个包下的日志可以这么打印。

ConsoleAppender:把日志添加到控制台FileAppender:把日志添加到文件RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。它是FileAppender的子additivity属性为false,表示此logger的打印信息不再向上级传递(注:该值默认为true,logger的日志信息会依次向上级传递,最高级logger为root,如果不加则至少打印2次,本身一次,root一次)-level:用来设置打印级别(TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF),还有一个值INHERITED或者同义词NULL,代表强制执行上级的级别。如果没有设置此属性,那么当前logger将会继承上级的级别。filter:过滤器可以通过LevelFilter过滤器设置日志最低的打印级别encoder:可用通过Pattern标签设置日志格式,通过charset设置日志的字符集 [%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n UTF-8 2.4 变量

用来定义变量值,它有两个属性name和value,通过定义的值会被插入到logger上下文中,可以使“${}”来使用变量。

name:变量的名称value:变量的值3、logback实例

springboot默认使用的日志框架是logback,其由三个组件组成

logback-corelogback-classiclogback-access org.slf4j slf4j-api 1.7.30 ch.qos.logback logback-classic 1.2.3

注:可以换成最新版本

[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n UTF-8 sys_info.log true INFO ACCEPT DENY sys_info.log.%d 30 [%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n UTF-8 sys_error.log true ERROR ACCEPT DENY sys_error.log.%d 12 [%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n UTF-8 D:/log/yj-test/b1.log true INFO ACCEPT DENY D:/log/yj-test/b1.log.%d 12 [%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n UTF-8 D:/log/yj-test/b2.log true INFO ACCEPT DENY D:/log/yj-test/b2.log.%d 12 [%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n UTF-8

测试代码:

package com.pdool.logdemo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class LogDemoApplication { public static void main(String[] args) { SpringApplication.run(LogDemoApplication.class, args); Logger logger = LoggerFactory.getLogger(LogDemoApplication.class); Logger gameLogger = LoggerFactory.getLogger("game"); logger.error("ccccccccccccccc"); gameLogger.error("bbbbbbbbbbb"); } }4、总结

日志组件要做的就是:

1、公用的变量统一定义 = property

1、日志需要什么什么样的格式输出到什么地方 = appender

2、定义不同的级别 = level

3、不同的日志输出口径 = logger

:定义变量

:定义日志记录器

:定义日志过滤器

:定义滚动策略

:定义日志适配的环境

:根日志记录器



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3